# 夹具的使用-sql语句的使用
import logging
from common.db import db
import pytest
import shutil
from common.tools import get_project_path, sep
from common import login
import os

# 测试数据文件地址
DATA_DIR = get_project_path() + sep(["report", "data"], add_before=True)
# 测试报告文件地址
API_DIR = get_project_path() + sep(["report", "api_report"], add_before=True)
# 全局实例化db方法
SQL = db()
# 默认备份的表（如果没有指定）
TABLES = []


# 夹具的使用-sql语句的使用
@pytest.fixture(scope="function", autouse=True)
def db_backup_reset(request):
    try:
        logging.info("测试开始")
        # 使用getattr获取测试函数上的backup_tables标记
        # 如果测试函数没有该标记,返回空列表
        marker = request.node.get_closest_marker("backup_tables")
        backup_tables = marker.args[0] if marker else []
        # 初始化一个空列表,存放拷贝的新表名
        # 检查是否有需要备份的表
        if backup_tables:
            # 如果存在表,那就执行SQL语句,也就是进行数据库表备份
            for table in backup_tables:
                # 重新生成新的表名
                print(SQL.insert_update_create_table(f"create table {table + '_black'} select * from {table}"))
                print(table)
                logging.info(f"执行备份操作+{table}")
                logging.info(f"关联的表{table}+{table + '_black'}")
            yield
            # 测试结束后执行恢复的SQL语句
            for table in backup_tables:
                # 正确的SQL语句
                print(SQL.insert_update_create_table(f"TRUNCATE TABLE {table}"))  # 清空原表
                print(SQL.insert_update_create_table(f"INSERT INTO {table} SELECT * FROM {table}_back"))  # 恢复数据
                print(SQL.insert_update_create_table(f"DROP TABLE {table}_back"))  # 删除备份表

                # 日志记录
                logging.info(f"关联的表: {table} 和 {table}_back")
                logging.info(f"执行恢复操作: {table}")

            logging.info("测试结束")
        else:
            yield
            logging.info("测试结束")
    except Exception as e:
        print(e)
        logging.error(e)